package com.zhiwen.setannotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解语法要求
 * 1)使用@Interface关键字定义注解；
 * <p>
 * 2)成员以无参无异常方式声明；
 * <p>
 * 3)可以用default为成员指定一个默认值；
 * <p>
 * 4)成员类型是受限的，合法的类型包括原始类型及String、Class、Annotation、Enumeration；
 * <p>
 * 5)如果注解只有一个成员，则成员必须取名为value()，在使用时可以忽略成员名和赋值号(=)；
 * <p>
 * 6)注解类可以没有成员，没有成员的注解称为标识注解；
 * <p>
 * 注解的注解(元注解)
 *
 * @Target({ElementType.METHOD,ElementType.TYPE}) CONSTRUCTOR：构造方法声明
 * FIELD：字段声明
 * LOACL_VARIABLE：局部变量声明
 * METHOD：方法声明
 * PACKAGE：包声明
 * PARAMETER：参数声明
 * TYPE：类或者接口声明
 * @Retention(RetentionPolicy.RUNTIME) SOURCE：只在源码显示，编译时会丢弃
 * CLASS：编译时会记录到class中，运行时忽略
 * RUNTIME：运行时存在，可以通过反射读取
 * @Inherited 允许子类继承
 * @Documented 生成javadoc时会包含注解
 */
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface DemoAnnotation {

    String desc() default "";

    String author() default "wuzhiwen";

    int age() default 18;

}
